﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace Ruandao.Misc
{
    public class WebUtility
    {
        /// <summary>
        /// 以当前请求的客户端路径为基准，把以～/、 ../、 ./和名称等4种形式打头的路径统一转化为以/打头的绝对路径。以 /和http:// 打头的路径保持不变。
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        static public string ToClientAbsoluteUrl(string url)
        {
            if ( string.IsNullOrWhiteSpace(url) ) return url;

            // segment的[0]为/,最后一个可能以/结尾，也可能不以/结尾，取决于Path的结尾字符。
            string[] baseSegment = HttpContext.Current.Request.Url.Segments;
            string path = url;
            if (url.StartsWith("http://", StringComparison.CurrentCulture))
            {
                path = new Uri(url).AbsolutePath;
            }
            else if (url.StartsWith("~/", StringComparison.CurrentCulture))
            {
                path = VirtualPathUtility.ToAbsolute(url);
            }
            else if (url.StartsWith("../", StringComparison.CurrentCulture))
            {
                // 由于segment中的最后一段是指当前文档，而不是当前文档的所在的目录，所以段数减一。
                int i = baseSegment.Length;
                path = url;
                do
                {
                    i--;
                    path = path.Substring(3);
                } while (path.StartsWith("../", StringComparison.CurrentCulture));

                // i=1，表示刚好一级一级向上到根目录，如果小于1就不在网站所包含的路径中了。
                if (i < 1) throw new Exception("指定的路径所使用的../路径已经超出网站的根目录。");
                string pathBase = "";
                for (int j = 0; j < i - 1; j++)
                {
                    pathBase += baseSegment[j];
                }
                path = pathBase + path;
            }
            else if (url.StartsWith("./", StringComparison.CurrentCulture))
            {
                int i = baseSegment.Length;
                string pathBase = "";
                for (int j = 0; j < i - 1; j++)
                {
                    pathBase += baseSegment[j];
                }
                path = pathBase + path.Substring(2);
            }
            else if (!url.StartsWith("/"))
            {
                int i = baseSegment.Length;
                string pathBase = "";
                for (int j = 0; j < i - 1; j++)
                {
                    pathBase += baseSegment[j];
                }
                path = pathBase + path;
            }
            return path;
        }

        /// <summary>
        /// 把位于当前应用程序下的客户端的绝对路径转变为以~打头的应用程序路径。仅处理以/打头的路径。
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        static public string ToServerAppUrl(string url)
        {
            throw new NotImplementedException();
        }
    }
}
